package config

import (
	"sync"
	"time"
)

// Config 应用配置结构 - 统一管理所有配置
type Config struct {
	App        AppConfig        `mapstructure:"app"`
	Server     ServerConfig     `mapstructure:"server"`
	Database   DatabaseConfig   `mapstructure:"database"`
	Redis      RedisConfig      `mapstructure:"redis"`
	Log        LogConfig        `mapstructure:"log"`
	Middleware MiddlewareConfig `mapstructure:"middleware"`
	Cache      CacheConfig      `mapstructure:"cache"`
	AccessLog  AccessLogConfig  `mapstructure:"accesslog"`

	mu sync.RWMutex
}

// AppConfig 应用配置
type AppConfig struct {
	Name        string `mapstructure:"name"`
	Version     string `mapstructure:"version"`
	Environment string `mapstructure:"environment"` // development/production
	Locale      string `mapstructure:"locale"`
}

// EnvironmentConfig 环境推导的配置
type EnvironmentConfig struct {
	Debug         bool
	LogLevel      string
	LogOutput     string
	LogFormat     string
	AccessLog     bool
	AccessLogBody bool
}

// ServerConfig 服务器配置
type ServerConfig struct {
	Host             string        `mapstructure:"host"`
	Port             int           `mapstructure:"port"`
	ReadTimeout      time.Duration `mapstructure:"read_timeout"`
	WriteTimeout     time.Duration `mapstructure:"write_timeout"`
	IdleTimeout      time.Duration `mapstructure:"idle_timeout"`
	AllowCrossDomain bool          `mapstructure:"allow_cross_domain"`
}

// DatabaseConfig 数据库配置
type DatabaseConfig struct {
	Driver          string        `mapstructure:"driver"`
	Host            string        `mapstructure:"host"`
	Port            int           `mapstructure:"port"`
	Database        string        `mapstructure:"database"`
	Username        string        `mapstructure:"username"`
	Password        string        `mapstructure:"password"`
	Charset         string        `mapstructure:"charset"`
	MaxIdleConns    int           `mapstructure:"max_idle_conns"`
	MaxOpenConns    int           `mapstructure:"max_open_conns"`
	ConnMaxLifetime time.Duration `mapstructure:"conn_max_lifetime"`
	LogLevel        string        `mapstructure:"log_level"`      // 数据库日志级别
	AutoMigrate     bool          `mapstructure:"auto_migrate"`   // 是否自动执行数据库迁移
	EnableWarmup    bool          `mapstructure:"enable_warmup"`  // 是否启用连接池预热
	WarmupTimeout   time.Duration `mapstructure:"warmup_timeout"` // 预热超时时间
}

// RedisConfig Redis配置
type RedisConfig struct {
	Host           string        `mapstructure:"host"`
	Port           int           `mapstructure:"port"`
	Password       string        `mapstructure:"password"`
	Database       int           `mapstructure:"database"`
	MaxIdle        int           `mapstructure:"max_idle"`
	MaxActive      int           `mapstructure:"max_active"`
	IdleTimeout    time.Duration `mapstructure:"idle_timeout"`
	ConnectTimeout time.Duration `mapstructure:"connect_timeout"`
	ReadTimeout    time.Duration `mapstructure:"read_timeout"`
	WriteTimeout   time.Duration `mapstructure:"write_timeout"`
}

// LogConfig 日志配置 - 简化版本
type LogConfig struct {
	Filename    string `mapstructure:"filename"`      // 日志文件路径
	MaxSize     int    `mapstructure:"max_size"`      // 单个日志文件最大大小（MB）
	MaxAge      int    `mapstructure:"max_age"`       // 日志文件保留天数
	MaxBackups  int    `mapstructure:"max_backups"`   // 最大备份文件数
	MaxBodySize int    `mapstructure:"max_body_size"` // 访问日志最大请求体大小（字节）
	Compress    bool   `mapstructure:"compress"`      // 是否压缩旧日志文件
	LocalTime   bool   `mapstructure:"local_time"`    // 是否使用本地时间
}

// MiddlewareConfig 中间件配置
type MiddlewareConfig struct {
	Auth      AuthMiddlewareConfig `mapstructure:"auth"`      // 认证中间件配置
	RateLimit RateLimitConfig      `mapstructure:"ratelimit"` // 限流中间件配置
	CORS      CORSConfig           `mapstructure:"cors"`      // CORS中间件配置
	Tracing   TracingConfig        `mapstructure:"tracing"`   // 链路追踪中间件配置
}

// AuthMiddlewareConfig 认证中间件配置
type AuthMiddlewareConfig struct {
	Enable           bool     `mapstructure:"enable"`            // 是否启用认证中间件
	JWTSecret        string   `mapstructure:"jwt_secret"`        // JWT签名密钥
	TokenExpiry      int      `mapstructure:"token_expiry"`      // JWT令牌过期时间（秒）
	SkipPaths        []string `mapstructure:"skip_paths"`        // 跳过认证的路径
	TokenHeader      string   `mapstructure:"token_header"`      // JWT令牌在Header中的字段名
	TokenQuery       string   `mapstructure:"token_query"`       // JWT令牌在Query中的字段名
	RefreshThreshold int      `mapstructure:"refresh_threshold"` // 令牌刷新阈值（秒）
	MaxRefreshCount  int      `mapstructure:"max_refresh_count"` // 最大刷新次数
	Issuer           string   `mapstructure:"issuer"`            // JWT签发者
}

// RateLimitConfig 限流中间件配置（简化版）
type RateLimitConfig struct {
	Enable    bool     `mapstructure:"enable"`     // 是否启用限流
	Rate      int      `mapstructure:"rate"`       // 每秒请求数限制
	Burst     int      `mapstructure:"burst"`      // 突发请求数限制
	SkipPaths []string `mapstructure:"skip_paths"` // 跳过限流的路径
}

// CORSConfig CORS中间件配置
type CORSConfig struct {
	Enable           bool     `mapstructure:"enable"`            // 是否启用CORS
	AllowOrigins     []string `mapstructure:"allow_origins"`     // 允许的来源
	AllowMethods     []string `mapstructure:"allow_methods"`     // 允许的HTTP方法
	AllowHeaders     []string `mapstructure:"allow_headers"`     // 允许的请求头
	ExposeHeaders    []string `mapstructure:"expose_headers"`    // 暴露的响应头
	AllowCredentials bool     `mapstructure:"allow_credentials"` // 是否允许携带凭证
	MaxAge           int      `mapstructure:"max_age"`           // 预检请求缓存时间（秒）
}

// TracingConfig 链路追踪中间件配置（简化版）
type TracingConfig struct {
	Enable        bool     `mapstructure:"enable"`          // 是否启用链路追踪
	TraceIDHeader string   `mapstructure:"trace_id_header"` // 请求ID在Header中的字段名
	SkipPaths     []string `mapstructure:"skip_paths"`      // 跳过追踪的路径
}

// CacheConfig 缓存系统配置 - 简化版
type CacheConfig struct {
	Enable     bool              `mapstructure:"enable"`      // 是否启用缓存
	Engine     string            `mapstructure:"engine"`      // 缓存引擎：memory/redis
	DefaultTTL string            `mapstructure:"default_ttl"` // 默认过期时间
	Memory     MemoryCacheConfig `mapstructure:"memory"`      // 内存缓存配置
	Redis      RedisCacheConfig  `mapstructure:"redis"`       // Redis缓存配置
}

// MemoryCacheConfig 内存缓存配置 - 简化版
type MemoryCacheConfig struct {
	MaxItems        int    `mapstructure:"max_items"`        // 最大条目数
	CleanupInterval string `mapstructure:"cleanup_interval"` // 清理间隔
}

// RedisCacheConfig Redis缓存配置 - 简化版
type RedisCacheConfig struct {
	URL    string `mapstructure:"url"`    // Redis连接URL
	Prefix string `mapstructure:"prefix"` // 键前缀
}

// AccessLogConfig 访问日志配置
type AccessLogConfig struct {
	SkipPaths     AccessLogSkipPaths `mapstructure:"skip_paths"`
	LightLogPaths []string           `mapstructure:"light_log_paths"`
}

// AccessLogSkipPaths 访问日志跳过路径配置
type AccessLogSkipPaths struct {
	Static []string `mapstructure:"static"` // 静态资源路径
	System []string `mapstructure:"system"` // 系统接口路径
}
